package br.ucb.musicbay.managedBean;

import java.util.List;
import java.util.Locale;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

import br.ucb.musicbay.artista.Artista;
import br.ucb.musicbay.artista.ArtistaBO;
import br.ucb.musicbay.artista.ArtistaDataModel;
import br.ucb.musicbay.business.Business;
import br.ucb.musicbay.usuario.Usuario;

public class ArtistaManagedBean {

	private Artista artista;
	private List<Artista> listaArtistas;
	private Artista[] artistasSelect;
	private ArtistaDataModel artistaDataModel;

	public ArtistaManagedBean() {
		setArtista(new Artista());
		artistaDataModel = new ArtistaDataModel(getListaArtistas());
	}

	public List<Artista> getListaArtistas() {
		ArtistaBO artistaBo = new ArtistaBO();
		this.listaArtistas = artistaBo.recoverAll();
		return listaArtistas;
	}

	public void setListaArtistas(List<Artista> listaArtistas) {
		this.listaArtistas = listaArtistas;
	}

	public ArtistaDataModel getArtistaDataModel() {
		return artistaDataModel;
	}

	public void setArtistaDataModel(ArtistaDataModel artistaDataModel) {
		this.artistaDataModel = artistaDataModel;
	}

	public Artista[] getArtistasSelect() {
		return artistasSelect;
	}

	public void setArtistasSelect(Artista[] artistasSelect) {
		this.artistasSelect = artistasSelect;
	}

	public Artista getArtista() {
		return artista;
	}

	public void carregaArtista(ValueChangeEvent event) {
		ArtistaBO artistaBo = new ArtistaBO();
		setArtista(artistaBo.recoverById((Integer) event.getNewValue()));
	}

	public void setArtista(Artista artista) {
		this.artista = artista;
	}

	public String actionDelete() {
		FacesContext context = FacesContext.getCurrentInstance();

		ArtistaBO artistaBo = new ArtistaBO();
		if (artistaBo.delete(getArtistasSelect())) {
			if(context.getViewRoot().getLocale().equals(new Locale("en")))	
				context.addMessage(null, new FacesMessage("Deletion was successful"));
			else
				context.addMessage(null, new FacesMessage("Exclusao realizada com sucesso!"));
			artistaDataModel = new ArtistaDataModel(getListaArtistas());
			artista=null;
			return "sucesso";
		} else {
			if(context.getViewRoot().getLocale().equals(new Locale("en")))
				context.addMessage(null, new FacesMessage("Attention! Error while deleting Band/Artist"));
			else
				context.addMessage(null, new FacesMessage("Atencao! Erro ao deletar Banda/Artista!"));
			return "falha";
		}
	}

	public String actionSave() {
		FacesContext context = FacesContext.getCurrentInstance();

		ArtistaBO artistaBo = new ArtistaBO();
		if (artistaBo.save(this.artista)) {
			if(context.getViewRoot().getLocale().equals(new Locale("en")))
				context.addMessage(null, new FacesMessage("Band/Artist " + artista.getNome() + " Registry successful!"));
			else
				context.addMessage(null, new FacesMessage("Banda/Artista " + artista.getNome() + " Cadastrado com sucesso!"));
			artista = null;
			return "sucesso";
		} else {
			if(context.getViewRoot().getLocale().equals(new Locale("en")))
				context.addMessage(null, new FacesMessage("Attention! Error while registering Band/Artist"));				
			else
				context.addMessage(null, new FacesMessage("Atencao! Erro ao cadastrar Banda/Artista"));
			return "falha";
		}
	}

	public String actionUpdate(ActionEvent event) {
		FacesContext context = FacesContext.getCurrentInstance();
		ArtistaBO artistaBo = new ArtistaBO();
		
		byte[] by = (byte[]) event.getComponent().getAttributes().get("img");
		if (by != null) {			
			getArtista().setImg(by);
		} 
		
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("fileUploadController", new FileUploadController());  
		if (artistaBo.update(this.artista)) {
			if(context.getViewRoot().getLocale().equals(new Locale("en")))
				context.addMessage(null, new FacesMessage("Update successful!"));				
			else
				context.addMessage(null, new FacesMessage("Atualizacao realizada com sucesso!"));
			return "sucesso";
		} else {
			if(context.getViewRoot().getLocale().equals(new Locale("en")))
				context.addMessage(null, new FacesMessage("Attention! Error while updating Band/Artist"));
			else
				context.addMessage(null, new FacesMessage("Atencao! Erro ao atualizar Banda/Artista!"));
			return "falha";
		}  
	}

	public void adminBiblioteca(ActionEvent event) {
		FacesContext context = FacesContext.getCurrentInstance();
		ArtistaBO artistaBo = new ArtistaBO();
		Business business = new Business();

		Usuario usuario = (Usuario) event.getComponent().getAttributes().get("usuario");
		Usuario us = business.verificaUsuarioDel(usuario, getArtista());

		if (us == null) {
			getArtista().getUsuarios().add(usuario);
			if(context.getViewRoot().getLocale().equals(new Locale("en")))
				context.addMessage(null, new FacesMessage(getArtista().getNome()+" added to the library"));				
			else
				context.addMessage(null, new FacesMessage(getArtista().getNome()+" foi adicionado a biblioteca"));
		} else {
			getArtista().getUsuarios().remove(us);
			if(context.getViewRoot().getLocale().equals(new Locale("en")))
				context.addMessage(null, new FacesMessage(getArtista().getNome()+" removed from the library"));
			else
				context.addMessage(null, new FacesMessage(getArtista().getNome()+" foi removida da biblioteca"));
		}

		if (artistaBo.update(this.artista)) {
		} else {
			if(context.getViewRoot().getLocale().equals(new Locale("en")))
				context.addMessage(null, new FacesMessage("Attention! Error while adding " + getArtista().getNome() + " to my library "));
			else
				context.addMessage(null, new FacesMessage("Atencao! Erro ao adicionar " + getArtista().getNome() + " a minha biblioteca "));
		}
	}

}
